package com.sky.delegate;


/**
 * 现在有一个项目project
 */
interface Delegate {
    //项目A
    void doProject();
}


/**
 * 程序员B
 */
class Programmer1 implements Delegate {
    @Override
    public void doProject() {
        System.out.println("程序员1完成登陆模块");
    }
}

/**
 * 程序员C
 */
class Programmer2 implements Delegate {
    @Override
    public void doProject() {
        System.out.println("程序2完成注册模块");
    }
}


/**
 * 项目经理A(虽然它也有工作,需要实现projectA,但是它的具体工作就是分配任务)
 */
class Manager implements Delegate {
    /**
     * 封装构造方法,来获得具体实现该需求(程序员B和C)的实例
     */
    private Delegate delegate;

    Manager(Delegate delegate) {
        this.delegate = delegate;
    }

    @Override
    public void doProject() {
        System.out.println("我是经理A");
        this.delegate.doProject();
    }
}


/**
 * date : 2020-09-01
 * 项目组，包括：项目经理、程序员1和程序员2。目前甲方有个项目，需要完成一个xxx任务。
 * 首先甲方会直接找到项目经理去谈这个项目，而不是直接找程序员。
 * <p>
 * 项目经理分析这个项目，发现需要两人合作来完成，所以将A1模块分给B，将A2模块分给C，由B和C来合作完成该项目。
 * <p>
 * 在该需求中，项目经理只起到了一个协调工作的作用，其实实际的工作是由B和C来完成的。由此可总结出委派模式的主要特点如下。
 * 委派模式的主要特点
 * <p>
 * 干活是我(B和C)的，功劳是你的(A)。 项目经理属于渔翁得利型
 * 委派模式的其他特点
 * ①委派机制，类似于中介的功能
 * ②持有被委托人的引用(项目经理A可以随意使唤B和C)
 * ③不关心过程，只关心结果(代理模式：关心的是过程，不关心结果)
 * <p>
 *
 * @author : wushikai
 */
public class MicroSoft {

    public static void main(String[] args) {
        //1.现在甲方有一个新的需求
        //2.项目经理分析完后,发现需要程序员B和C来完成
        Delegate programmerB = new Programmer1();
        Delegate programmerC = new Programmer2();
        //3.项目经理获取到B和C的引用，然后让B和C来完成工作
        new Manager(programmerB).doProject();
        new Manager(programmerC).doProject();
        //4.工作完成
        //5.代码看着像是项目经理A完成的，但实际是B和C完成的。即：干活是B和C，实际功劳确实A的
    }


}









